//配置路由
//第一步：引入插件、安装插件
import VueRouter from "vue-router";
import Vue from "vue";
Vue.use(VueRouter);

// 引入路由相关的配置项
import routes from '@/router/routes'
import store from "@/store";




//把人家原型对象的push方法进行保存
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
    //当前函数this：即为VueRouter类的实例
    //相当于push方法里面this，是windows【完犊子了】
    //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

    //面试:函数apply与call区别?
    //相同的地方:都可以篡改函数里面this
    //不同的地方:apply传递参数 数组  call传递参数 逗号分割

    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}


VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}



//第二步:暴露VueRouter类的实例
//对外暴露一个路由器,实质是VueRouter类的实例,一个路由器可以管理多个路由
const router = new VueRouter({
    //配置路由
    routes,
    // 设置滚动条的位置
    scrollBehavior() {
        return { y: 0 }
    }
});

export default router;

// 导航守卫
router.beforeEach(async (to, from, next) => {
    let hasToken = store.state.user.token;

    let hasNickName = store.state.user.nickName;

    if (hasToken) {
        // 用户登录  不能去login
        if (to.path == '/login') {
            next('/home')
        } else {

            // 用户登录 有没用户信息
            if (hasNickName) {
                next();

            } else {
                // 登录后 没有用户信息
                try {
                    // 获取用户信息
                    await store.dispatch("getUserInfo");
                    next()

                } catch (error) {
                    // 清除本地数据  再次登录
                    await store.dispatch('logout')
                    next('/login')
                }

            }

        }
    } else {
        // 未登录
        let toPath = to.path;
        if (toPath.indexOf('trade') !== -1 || toPath.indexOf('pay') !== -1 || toPath.indexOf('center') !== -1){
            next('/login?redirect='+toPath)
        }else{
            next()
        }
    }

})